<?php
require_once 'BancoDeDados.php';
require_once 'Grupo.php';
require_once 'Recurso.php';
class Permissao {

    private $cod_permissao;
    private $consulta;
    private $inclusao;
    private $alteracao;
    private $exclusao;
    private $grupo;
    private $recurso;

    public function &getCod_permissao() {
        return $this->cod_permissao;
    }

    public function setCod_permissao(&$cod_permissao) {
        $this->cod_permissao = &$cod_permissao;
    }

    public function &getConsulta() {
        return $this->consulta;
    }

    public function setConsulta(&$consulta) {
        $this->consulta = &$consulta;
    }

    public function &getInclusao() {
        return $this->inclusao;
    }

    public function setInclusao(&$inclusao) {
        $this->inclusao = &$inclusao;
    }

    public function &getAlteracao() {
        return $this->alteracao;
    }

    public function setAlteracao(&$alteracao) {
        $this->alteracao = &$alteracao;
    }

    public function &getExclusao() {
        return $this->exclusao;
    }

    public function setExclusao(&$exclusao) {
        $this->exclusao = &$exclusao;
    }

    public function &getGrupo() {
        return $this->grupo;
    }

    public function setGrupo(&$grupo) {
        $this->grupo = &$grupo;
    }

    /**
     *
     * @return Recurso
     */
    public function &getRecurso() {
        return $this->recurso;
    }

    public function setRecurso(Recurso &$recurso) {
        $this->recurso = &$recurso;
    }
    
    public function cadastrar() {
        if ($this->validar() != 1) {
            throw new Exception("Permissão existente");
        }
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('insert into permissao (consulta, inclusao, alteracao, exclusao, cod_grupo, cod_recurso) values(?,?,?,?,?,?)');
        $result = $link->execute($stmt, array($this->consulta, $this->inclusao, $this->alteracao, $this->exclusao, $this->grupo->getCod_grupo(), $this->recurso->getCod_recurso()));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception($result->getMessage());
        }
        $result = $banco->getLink()->query('select cod_permissao from permissao where consulta = ? and inclusao = ? and alteracao = ? and exclusao = ? and cod_grupo = ? and cod_recurso = ?', array($this->consulta, $this->inclusao, $this->alteracao, $this->exclusao, $this->grupo->getCod_grupo(), $this->recurso->getCod_recurso()));
        if (DB::isError($result)) {
            throw new Exception($result->getMessage());
        }
        if($result->numRows() == 0) {
            throw new Exception("Permissão inexistente");
        } elseif($result->numRows() > 1) {
            throw new Exception("Mais de uma Permissão com o mesmo identificador, informar ao administrador");
        }
        $result->fetchInto($row);
        $this->setCod_permissao($row['cod_permissao']);
        $link->commit();
    }
    
    public function alterarCampo(&$campo_id, &$campo_valor) {
        if ($campo_id == 'consulta' && $this->consulta != $campo_valor) {
            $this->consulta = &$campo_valor;
        } else if ($campo_id == 'inclusao' && $this->inclusao != $campo_valor) {
            $this->inclusao = &$campo_valor;
        } else if ($campo_id == 'alteracao' && $this->alteracao != $campo_valor) {
            $this->alteracao = &$campo_valor;
        } else if ($campo_id == 'exclusao' && $this->exclusao != $campo_valor) {
            $this->exclusao = &$campo_valor;
        } else {
            throw new Exception('no_action');
        }
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('update permissao set ' . $campo_id . ' = ? where cod_permissao = ?');
        $result = $link->execute($stmt, array($campo_valor, $this->cod_permissao));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception($result->getMessage());
        }
        $link->commit();
    }

    public function excluir() {
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('delete from permissao where cod_permissao = ?');
        $result = $link->execute($stmt, array($this->cod_permissao));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception($result->getMessage());
        }
        $link->commit();
    }

    public function &isRecurso($recurso) {
        if ($this->recurso->getDescricao() == $recurso) {
            return true;
        }
        return false;
    }

    public static function listar(&$cod_grupo) {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select * from permissao where cod_grupo = ?', array($cod_grupo));
        if (DB::isError($result)) {
            throw new Exception($result->getMessage());
        }
        $resultado = array();
        while ($result->fetchInto($row)) {
            $permissao = new Permissao();
            $permissao->setCod_permissao($row['cod_permissao']);
            $permissao->setAlteracao($row['alteracao']);
            $permissao->setConsulta($row['consulta']);
            $permissao->setExclusao($row['exclusao']);
            $permissao->setInclusao($row['inclusao']);
            $permissao->setRecurso(Recurso::consultar($row['cod_recurso']));
            $resultado[$row['cod_permissao']] = &$permissao;
            unset ($permissao);
        }
        return $resultado;
    }

    public static function consultar(&$cod_permissao) {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select * from permissao where cod_permissao = ?', array($cod_permissao));
        if (DB::isError($result)) {
            throw new Exception($result->getMessage());
        }
        if($result->numRows() == 0) {
            throw new Exception("Permissão inexistente");
        } elseif($result->numRows() > 1) {
            throw new Exception("Mais de uma Permissão com o mesmo identificador, informar ao administrador");
        }
        $result->fetchInto($row);
        $permissao = new Permissao();
        $permissao->setCod_permissao($row['cod_permissao']);
        $permissao->setAlteracao($row['alteracao']);
        $permissao->setConsulta($row['consulta']);
        $permissao->setExclusao($row['exclusao']);
        $permissao->setInclusao($row['inclusao']);
        $permissao->setRecurso(Recurso::consultar($row['cod_recurso']));
        return $permissao;
    }

    private function validar() {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select cod_permissao from permissao where cod_grupo = ? and cod_recurso = ?', array($this->grupo->getCod_grupo(), $this->recurso->getCod_recurso()));
        if (DB::isError($result)) {
            throw new Exception($result->getMessage());
        }
        if ($result->numRows() > 0) {
            return 0;
        }
        return 1;
    }
}
 ?>